fsck: Include the commits that contain the corruption in errors
authorAlexander Larsson <alexl@redhat.com>
Thu, 17 May 2018 08:05:49 +0000 (10:05 +0200)
committerAtomic Bot <atomic-devel@projectatomic.io>
Thu, 24 May 2018 21:00:52 +0000 (21:00 +0000)
This makes it easier to figure out what the corruption affects.

Closes: #1591
Approved by: cgwalters

src/ostree/ot-builtin-fsck.c
tests/test-corruption.sh

index 81124d3f6c31eaa828c1d3fa83c56e0a8edbdc36..b3f06e4d6db0b07964ce6618796da0d80ee36ef3 100644 (file)
@@ -63,16 +63,31 @@ fsck_one_object (OstreeRepo            *repo,
   if (!ostree_repo_fsck_object (repo, objtype, checksum, cancellable, &temp_error))
     {
       gboolean object_missing = FALSE;
+      g_auto(GStrv) parent_commits = NULL;
+      g_autofree char *parent_commits_str = NULL;
+
+      if (object_parents)
+        {
+          parent_commits = ostree_repo_traverse_parents_get_commits (object_parents, key);
+          parent_commits_str = g_strjoinv (", ", parent_commits);
+        }
 
       if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
         {
           g_clear_error (&temp_error);
-          g_printerr ("Object missing: %s.%s\n", checksum,
-                      ostree_object_type_to_string (objtype));
+          if (parent_commits_str)
+            g_printerr ("Object missing in commits %s: %s.%s\n", parent_commits_str, checksum,
+                        ostree_object_type_to_string (objtype));
+          else
+            g_printerr ("Object missing: %s.%s\n", checksum,
+                        ostree_object_type_to_string (objtype));
           object_missing = TRUE;
         }
       else
         {
+          if (parent_commits_str)
+            g_prefix_error (&temp_error, "In commits %s: ", parent_commits_str);
+
           if (opt_delete)
             {
               g_printerr ("%s\n", temp_error->message);
@@ -90,9 +105,8 @@ fsck_one_object (OstreeRepo            *repo,
         {
           *out_found_corruption = TRUE;
 
-          if (object_parents != NULL && objtype != OSTREE_OBJECT_TYPE_COMMIT)
+          if (parent_commits != NULL && objtype != OSTREE_OBJECT_TYPE_COMMIT)
             {
-              g_auto(GStrv) parent_commits =  ostree_repo_traverse_parents_get_commits (object_parents, key);
               int i;
 
               /* The commit was missing or deleted, mark the commit partial */
index f26ed2d2676848c34f8b4eaa7532d91e890b941f..4994e277e1e3bed6ee3c0656919c3f79635ef830 100755 (executable)
@@ -104,7 +104,7 @@ assert_not_has_file repo/state/${rev}.commitpartial
 if $OSTREE fsck -q 2>err.txt; then
     assert_not_reached "fsck unexpectedly succeeded"
 fi
-assert_file_has_content_literal err.txt "Object missing:"
+assert_file_has_content_literal err.txt "Object missing"
 assert_file_has_content_literal err.txt "Marking commit as partial: $rev"
 assert_has_file repo/state/${rev}.commitpartial